/*
Auteur        :Valentijn Polder
Studentnummer :0782531

$Log: SPI.c,v $
Revision 1.2  2010/05/20 07:35:08  0782531
Commentaar toegevoegd.
IO uitwisselingen toegepast.
Juiste nitialistatie volgorde geimplementeerd

Revision 1.1.1.2  2010/04/26 12:04:57  0793573
Toevoeging eerste versie TWI

Revision 1.1.1.1  2010/04/25 10:53:42  Valentijn
no message


*/

#include <mod/include/SPI.h>

unsigned short int init__spi=0;

int SPI_Init(unsigned short int select, unsigned short int polarity, unsigned short int phase, unsigned short int bits, unsigned short int divider){
   if(!(p_flag&US1_ID)){                                                 //Check of Uart1 niet al gebruikt wordt
      if(!init__spi){                                                    //Check of er niet al een deel van spi is geinitialiseerd is
         p_pPMC->PMC_PCER |= SPI_ID;                                     //Enable Peripheral clock voor SPI
         p_flag |= SPI_ID;                                               //Set flag dat SPI actief is
         p_pPIO->PIO_ASR  = 0x80007800;                                  //Zet de juiste toewijzingen naar de peripheral
         p_pPIO->PIO_BSR  = 0x00400400;                                  //Zet de juiste toewijzingen naar de peripheral
         p_pPIO->PIO_PDR  = 0x80407C00;                                  //Zet de pinnen naar peripheral stand
         p_pSPI->SPI_CR = 0x00000001;                                    //Enable spi module
         p_pSPI->SPI_MR = 0x00000013;                                    //Algemene instellingen
//         p_pSPI->SPI_MR = 0x06000013;                                    //Algemene instellingen
         init__spi=1;
      }
      if(select>3){                                                      //Check of er geen illegale select gekozen is
         return(-1);                                                     //Geef terug dat er een illegale check is gekozen
      }else{
         p_pSPI->SPI_CSR[select] = 0;                                    //Clear de gekozen select select
         p_pSPI->SPI_CSR[select] |= 0x01 & polarity;                     //Stel de gekozen waardes in
         p_pSPI->SPI_CSR[select] |= (0x01 & phase)<<1;
         p_pSPI->SPI_CSR[select] |= 0<<3;                                //De 1 of 0 hier vervangen bepaalt of de selectlijn laagt blijft totdat er een andere chip gekozen wordt(1) of dat er gekozen kan worden tijdens de zelfde chipselect de chipselect lijn omhoog te gooien
         p_pSPI->SPI_CSR[select] |= (0x0F & (bits-8))<<4;                //Selecteer aantal bits tussen 8 t/m 16
         p_pSPI->SPI_CSR[select] |= (0xFF & divider)<<8;                 //Selecteer clock divider voor output
         p_pSPI->SPI_CSR[select] |= 50 <<16;                 //Selecteer clock divider voor output
         p_pSPI->SPI_CSR[select] |= 1 <<24;                              //verander hier de delay waarde tussen de transfers delay=(32 x waarde)/MCK
      }
      return(1);                                                         //geef terug dat het goed geinitialiseerd was
   }else{
      return(2);                                                         //geef terug dat Uart1 aan staat
   }
}

void SPI_Write(unsigned short int select, unsigned int data, unsigned long int last){
   while(!(p_pSPI->SPI_SR&0x02));                                        //check of er data verstuurt kan worden
   if(last){
      last=0x01000000;
   }
   p_pSPI->SPI_TDR = (0xFFFF & data)|((~(0x0f&(0x01<<select)))<<16)|(last);     //Schrijf data naar buffer
}

int SPI_Read(unsigned short int select){
   if(init__spi){                                                        //check of module geinitialiseerd is
//      if(p_pSPI->SPI_RDR&0x40){                                          //check of er data is
//         return(-1);                                                     //geef terug dat er geen data is
//      }else{
      while(!(p_pSPI->SPI_RDR&0x40));                                          //check of er data is
         return(p_pSPI->SPI_SR&0xFFFF);                                  //geef data terug
//      }
   }else{
      return(-2);                                                        //Geef terug dat de module nog niet geinitialiseerd is
   }
}

void SPI_Stop(void){
   if(init__spi){
      p_pSPI-> SPI_CR = 0x00000002;                                      //Zet module uit
      p_pPMC->PMC_PCER |= SPI_ID;                                       //Disable Peripheral clock for USART0
      p_flag &= ~SPI_ID;                                                 //Zet flag laag
      p_pPIO->PIO_PER  = 0x80407C00;                                     //geef io terug
   }
}

